package com.han.hotelplat.comm.utils;


import java.io.IOException;
import java.util.ArrayList;

import com.alibaba.fastjson.JSONObject;
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.SingleMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.base.payload.APNPayload;

import java.util.List;

import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.AbstractTemplate;
import com.gexin.rp.sdk.template.TransmissionTemplate;
import com.google.gson.JsonObject;

public class AppHotelPushUtil {
	// 定义常量, appId、appKey、masterSecret 采用本文档 "第二步 获取访问凭证 "中获得的应用配置
	private static String appId = "MBeeQ3ow9A7dkmG5U9T4b6";
	private static String appKey = "kjMmUUCAtX5IxbyauwyeJ";
	private static String masterSecret = "Zg3xvMxqYW9iexVjOp3Tu5";
	private static String url = "http://sdk.open.api.igexin.com/apiex.htm";
	private static IGtPush push = new IGtPush(url, appKey, masterSecret);
	
	// 采用"Java SDK 快速入门"， "第二步 获取访问凭证 "中获得的应用配置，用户可以自行替换

	// ios 515b772897a9feba254b4d7598ee9554
	// static String CID = "2d8e197cea6a18fec88aea3e5db8e924";
	static String CID = "bb68ebc360e0530475cd6c3e53c7c8c3";
	// 别名推送方式
	// static String Alias = "";
	static String host = "http://sdk.open.api.igexin.com/apiex.htm";

	public static void main(String[] args) throws IOException {
		JSONObject queryJO=new JSONObject();
		queryJO.put("taskId", "T20180425120106390");
		pushMessage(CID, 
				"【有人有活】", "您的任务T20180425120106390已被酒店取消，点击查看详情", "getEmployeeTaskDetail", queryJO);
	}

	public static void pushMessage(String cid, String appName,String tipsContent, String url, JSONObject reqparam){
		AbstractTemplate template = openPageView(appName,tipsContent,url,reqparam);
		LogUtil.info("酒店端推送：cid="+cid+";tipsContent="+tipsContent+";param="+reqparam.toJSONString());
		List<String> appIds = new ArrayList<String>();
		appIds.add(appId);

		// 定义"AppMessage"类型消息对象，设置消息内容模板、发送的目标App列表、是否支持离线发送、以及离线消息有效期(单位毫秒)
		SingleMessage message = new SingleMessage();
		message.setData(template);
		// message.setAppIdList(appIds);
		message.setOffline(true);
		message.setOfflineExpireTime(1000 * 600);
		message.setPushNetWorkType(0);

		Target target = new Target();
		target.setAppId(appId);
		target.setClientId(cid);

		IPushResult ret = push.pushMessageToSingle(message, target);
		System.out.println(ret.getResponse().toString());
	}
	
	public static TransmissionTemplate openPageView(String appName,String tipsContent,String pageName,JSONObject query) {
		TransmissionTemplate template = new TransmissionTemplate();
		template.setAppId(appId);
		template.setAppkey(appKey);
		// 透传消息设置，1为强制启动应用，客户端接收到消息后就会立即启动应用；2为等待应用启动
		template.setTransmissionType(2);
		// {title:"通知标题",content:"通知内容",payload:"通知去干嘛这里可以自定义"}
		JsonObject wrapJo = new JsonObject();
		// ios只能有通知内容。因为在app前台的时候 ，需要自己的代码去创建本地信息 这时title是无效的，固定为程序的名称。
		wrapJo.addProperty("title", appName);
		wrapJo.addProperty("content", tipsContent);

		// 内容
		JSONObject dataJo = new JSONObject();
		dataJo.put("name", pageName);
		if(query!=null) {
			dataJo.put("query", query);
		}

		JSONObject payloadJo = new JSONObject();
		payloadJo.put("t", "1");
		payloadJo.put("d", dataJo);
		wrapJo.addProperty("payload", payloadJo.toString());
		template.setTransmissionContent(wrapJo.toString());
		// 上面的信息构建后，ios在前台时收到的是：{"payload":"{\"t\":\"1\",\"d\":{\"name\":\"pageMyMoneyBag\"}}","title":"通知标题","content":"通知内容","type":"receive","aps":null}

		// 上面的代码兼容android所有情况。但是不兼容ios在后台时候的情况。
		// 这里的代码是为了后台时，有消息中心弹框，且有内容
		APNPayload payload = new APNPayload();
		APNPayload.DictionaryAlertMsg da = new APNPayload.DictionaryAlertMsg();
//		da.setTitle("消息中心显示出来的大标题");
//		da.setSubtitle("消息中心显示出来的小标题");
		 da.setBody(tipsContent);
		payload.setAlertMsg(da);

		// payload.addCustomMsg("title", "11");//这些信息会被添加到“payload”的节点中
		// payload.addCustomMsg("content", "22");//这些信息会被添加到“payload”的节点中
		payload.addCustomMsg("payload", payloadJo.toString());// 覆盖“payload”节点，也就是上面“payload.addCustomMsg（）”添加的数据都没用了
		template.setAPNInfo(payload);
		// APN是在ios在后台的时候采用的通讯。在app中是不知道APN信息过来的 只有当用户点击后才知道
		// =用户点击了消息后 获取到的：
		// {"payload":{"t":"1","d":{"name":"pageMyMoneyBag"}},"title":"有人有活-酒店端","content":{"subtitle":"消息中心显示出来的小标题","title":"消息中心显示出来的大标题"},"type":"click","aps":{"alert":{"subtitle":"消息中心显示出来的小标题","title":"消息中心显示出来的大标题"},"mutable-content":1,"sound":"default"}}""

		return template;
	}

}
